マスタリング・ライトニングネットワーク ―ビットコインの迅速な支払いを実現するセカンドレイヤーブロックチェーンプロトコル
2022
目次
第I部 ライトニングネットワークを理解する
1.1 ライトニングネットワークの基本概念
1.2 非中央集権ネットワークでのトラスト
1.3 中央の権威に頼らない公正性
1.3.1 仲介者なしの信頼できるプロトコル
1.3.2 実際のフェアネスプロトコル
1.3.3 構成要素としてのセキュリティプリミティブ
1.3.4 フェアネスプロトコルの例
1.4 ライトニングネットワークの目的
1.4.1 ブロックチェーンのスケーリング
1.5 ライトニングネットワークの特徴
1.6 ライトニングネットワークのユースケース、ユーザー、ユーザーストーリー
1.7 まとめ
2章 ライトニングネットワークを使うための準備
2.1 Aliceの初めてのライトニングウォレット
2.4.1 テストネットビットコイン
2.5 複雑さと制御のバランス
2.6 ライトニングウォレットのダウンロードとインストール
2.7 新しいウォレットを作成する
2.7.1 鍵の管理人
2.7.3 ニーモニックを安全に保管する
2.8 ビットコインをウォレットに読み込む
2.8.1 ビットコインを手に入れる
2.8.2 ビットコインを受け取る
2.9.1 ライトニングネットワークチャネル
2.9.2 ライトニングチャネルを開く
2.10 ライトニングネットワークを使ってコーヒーを購入する
2.10.1 Bob's Cafe
2.10.2 ライトニングインボイス
2.11 まとめ
3章 ライトニングネットワークの仕組み
3.1 ペイメントチャネルとは何か
3.2 ペイメントチャネルの基礎
3.3 チャネル間での支払いのルーティング
3.4 ペイメントチャネル
3.4.1 マルチシグアドレス
3.4.2 ファンディングトランザクション
3.4.3 コミットメントトランザクション
3.4.4 古い状態を使った不正
3.4.5 チャネルを公表する
3.4.6 チャネルを閉じる
3.5 インボイス
3.5.1 ペイメントハッシュとプリイメージ
3.5.2 その他のメタデータ
3.6 ペイメントの配送
3.6.1 ピアツーピアゴシッププロトコル
3.6.2 経路探索とルーティング
3.7 ソースベースの経路探索
3.7.1 オニオンルーティング
3.7.2 ペイメント転送アルゴリズム
3.8 ピアツーピア通信の暗号化
3.9 トラスト(信頼)について
3.10 ビットコインとの比較
3.10.1 アドレスとインボイス、トランザクションとペイメント
3.10.2 アウトプットの選択とパスの探索
3.10.3 チェンジアウトプットを持つビットコインと持たないライトニング
3.10.4 マイニング手数料とルーティング手数料
3.10.5 トラフィックに応じて変化する手数料と公表した手数料
3.10.6 公開されるビットコイントランザクションと非公開のライトニングペイメント
3.10.7 承認を待つビットコインと直ちに決済するライトニング
3.10.8 金額に制限がないビットコインとキャパシティ制限があるライトニング
3.10.9 大口決済と小口決済
3.10.10 ブロックチェーンを台帳として使うか、裁判制度として使うか
3.10.11 オフラインかオンラインか、非同期か同期か
3.10.12 satoshiとmillisatoshi
3.11 ビットコインとライトニングの共通点
3.11.1 通貨単位
3.11.2 支払いの不可逆性と完了性
3.11.3 トラスト(信頼)とカウンターパーティーリスク
3.11.4 パーミッションレスなオペレーション
3.11.5 オープンソースとオープンシステム
3.12 まとめ
4章 ライトニングノードソフトウェア
4.1 ライトニング開発環境
4.1.1 コマンドラインを使う
4.1.2 本書のリポジトリをダウンロードする
4.2 Dockerコンテナ
4.3 Bitcoin CoreとRegtest
4.3.1 Bitcoin Coreコンテナをビルドする
4.4 c-lightningライトニングノードプロジェクト
4.4.1 c-lightningをDockerコンテナとしてビルドする
4.4.2 Dockerネットワークをセットアップする
4.4.3 bitcoindコンテナとc-lightningコンテナを実行する
4.4.4 c-lightningをソースコードからインストールする
4.4.5 必要なライブラリとパッケージをインストールする
4.4.6 c-lightningのソースコードをコピーする
4.4.7 c-lightningのソースコードをコンパイルする
4.5 Lightning Network Daemonノードプロジェクト
4.5.1 LND Dockerコンテナ
4.5.2 bitcoindコンテナとLNDコンテナを実行する
4.5.3 LNDをソースコードからインストールする
4.5.4 LNDのソースコードをコピーする
4.5.5 LNDのソースコードをコンパイルする
4.6 Eclairライトニングノードプロジェクト
4.6.1 Eclair Dockerコンテナ
4.6.2 bitcoindコンテナとEclairコンテナを実行する
4.6.3 Eclairをソースコードからインストールする
4.6.4 Eclairのソースコードをコピーする
4.6.5 Eclairのソースコードをコンパイルする
4.7 さまざまなライトニングノードで構成された完全なネットワークを構築する
4.7.1 docker-composeを使ってDockerコンテナのオーケストレーションを行う
4.7.2 docker-composeを設定する
4.7.3 サンプルライトニングネットワークを開始する
4.7.4 チャネルを開いてペイメントをルーティングする
4.8 まとめ
5章 ライトニングネットワークノードの運用
5.1 プラットフォームを選択する
5.1.1 ライトニングノードの実行にとって信頼性が重要なのはなぜか
5.1.2 ライトニングノードのハードウェアの種類
5.1.3 クラウドで実行する
5.1.4 ノードを自宅で実行する
5.1.5 ライトニングノードの実行に必要なハードウェア
5.1.6 クラウドでのサーバー設定の切り替え
5.2 インストーラまたはヘルパーを使う
5.2.1 RaspiBlitz
5.2.2 myNode
5.2.3 Umbrel
5.2.4 BTCPay Server
5.2.5 ビットコインノードか、軽量なライトニングか
5.2.6 OSの選択
5.3 ライトニングノードの実装を選択する
5.4 ビットコインノードまたはライトニングノードをインストールする
5.4.1 バックグラウンドサービス
5.4.2 プロセスの分離
5.4.3 ノードの起動
5.4.4 ノードの設定
5.4.5 ネットワークの設定
5.5 ノードのセキュリティ
5.5.1 OSのセキュリティ
5.5.2 ノードアクセス
5.6 ノードとチャネルのバックアップ
5.6.1 ホットウォレットのリスク
5.6.2 資金をスイープする
5.7 ライトニングノードのアップタイムと可用性
5.7.1 障害耐性と自動化
5.7.2 ノードの可用性を監視する
5.7.3 ウォッチタワー
5.8 チャネルの管理
5.8.1 アウトバウンドチャネルを開く
5.8.2 インバウンドの流動性を手に入れる
5.8.3 チャネルを閉じる
5.8.4 チャネルのリバランス
5.9 ルーティング手数料
5.10 ノードの管理
5.10.1 Ride The Lightning
5.10.2 lndmon
5.10.3 ThunderHub
5.11 まとめ
6章 ライトニングネットワークのアーキテクチャ
6.1 ライトニングネットワークのプロトコルスイート
6.2 ライトニングを詳しく理解する
7章 ペイメントチャネル
7.1 ビットコインシステムを使う別の方法
7.2 ビットコインの所有権と管理
7.2.1 単独の所有権とマルチシグ
7.2.2 共同所有権
7.2.3 ビットコインが「ロック」されて使えなくなるのを防ぐ
7.3 ペイメントチャネルを作成する
7.3.1 ノードの秘密鍵と公開鍵
7.3.2 ノードのネットワークアドレス
7.3.3 ノードの識別子
7.3.4 ノードに直接のピアとして接続する
7.4 チャネルを作成する
7.4.1 Peer Protocol for Channel Management
7.4.2 チャネル確立のメッセージフロー
7.4.3 ファンディングトランザクション
7.4.4 マルチシグアドレスを生成する
7.4.5 ファンディングトランザクションを作成する
7.4.6 署名済みトランザクションをブロードキャストせずに保有する
7.4.7 入金の前に払い戻し
7.4.8 署名済みの払い戻しトランザクションを作成する
7.4.9 トランザクションをブロードキャストせずにつなぎ合わせる
7.4.10 トランザクション展性を解決する:Segregated Witness
7.4.11 ファンディングトランザクションをブロードキャストする
7.5 チャネル経由でペイメントを送信する
7.5.1 残高を分割する
7.5.2 コミットメントの競合
7.5.3 古いコミットメントトランザクションを使った不正
7.5.4 古いコミットメントトランザクションを失効させる
7.5.5 非対称コミットメントトランザクション
7.5.6 to_selfの遅延支払い(タイムロック)
7.5.7 失効鍵
7.6 コミットメントトランザクション
7.7 チャネルの状態を遷移させる
7.7.1 commitment_signedメッセージ
7.7.2 revoke_and_ackメッセージ
7.7.3 失効と再コミット
7.7.4 実際の不正行為とペナルティ
7.7.5 チャネルリザーブ:リスクを負わせる
7.8 チャネルを閉じる:協力的クローズ
7.8.1 shutdownメッセージ
7.8.2 closing_signedメッセージ
7.8.3 協力的クローズトランザクション
7.9 まとめ
8章 ペイメントチャネルネットワークでのルーティング
8.1 支払いのルーティング
8.2 ルーティングと経路探索
8.3 ペイメントチャネルのネットワークを作成する
8.4 ルーティング:物理的な例
8.5.1 アトミックでトラストレスなマルチホップペイメントを実装する
8.6 チップの例
8.6.1 HTLCのオンチェーン決済とオフチェーン決済
8.7 HTLC(Hash Time-Locked Contract) 8.7.1 ビットコインスクリプトでのHTLC
8.7.2 ペイメントプリイメージとハッシュの検証
8.7.3 HTLCをAliceからDinaまで拡張する
8.7.4 シークレットの逆伝播
8.7.5 署名の紐付け:HTLCが盗まれないようにする
8.7.6 ハッシュの最適化
8.7.7 HTLCの協力的な失敗とタイムアウトによる失敗
8.7.8 タイムロックを短くする
8.8 まとめ
9章 チャネルの操作とペイメントの転送
9.1 ローカル(シングルチャネル)とリモート(複数のチャネル)
9.2 ペイメントの転送とHTLCによるコミットメントの更新
9.2.1 HTLCとコミットメントのメッセージフロー
9.3 HTLCによるペイメントの転送
9.3.1 HTLCを追加する
9.3.2 update_add_htlcメッセージ
9.3.3 コミットメントトランザクションでのHTLC
9.3.4 HTLCアウトプットを持つ新しいコミットメント
9.3.5 Aliceがコミットする
9.3.6 Bobが新しいコミットメントを承認し、古いコミットメントを取り消す
9.3.7 Bobがコミットする
9.4 複数のHTLC
9.5 HTLCの解決
9.5.1 HTLCの伝播
9.5.2 DinaがChanのHTLCを決済する
9.5.3 BobがAliceのHTLCを決済する
9.6 エラーまたは期限切れによるHTLCの削除
9.7 ローカルペイメントの実行
9.8 まとめ
10.1 オニオンルーティング:物理的な例
10.1.1 パスを選択する
10.1.2 層を構築する
10.1.3 層を剥がす
10.2 HTLCのオニオンルーティング
10.2.1 Aliceがパスを選択する
10.2.2 Aliceがペイロードを作成する
10.2.3 鍵の生成
10.3 オニオン層のラッピング
10.3.1 固定長のオニオン
10.3.2 オニオンのラッピング:概要
10.3.3 Dinaのホップペイロードをラッピングする
10.3.4 Chanのホップペイロードをラッピングする
10.3.5 Bobのホップペイロードをラッピングする
10.3.6 最後のオニオンパケット
10.4 オニオンの送信
10.4.1 update_add_htlcメッセージ
10.4.2 AliceがBobにオニオンを送信する
10.4.3 Bobがオニオンを確認する
10.4.4 Bobがフィラーを生成する
10.4.5 Bobがホップペイロードの難読化を解除する
10.4.6 Bobが次のホップのために外側のHMACを取り出す
10.4.7 Bobがペイロードを削除し、オニオンを左にシフトする
10.4.8 Bobが新しいオニオンパケットを作成する
10.4.9 BobがHTLCの内容を確認する
10.4.10 Bobがupdate_add_htlcメッセージをChanに送信する
10.4.11 Chanがオニオンを転送する
10.4.12 Dinaが最後のペイロードを受け取る
10.5 エラーを返す
10.5.1 エラーメッセージ
10.6 keysendによる自発的な支払い
10.6.1 カスタムオニオンTLVレコード
10.6.2 keysendのペイメントの送信と受信
10.6.3 ライトニングアプリケーションでのkeysendとカスタムレコード
10.7 まとめ
11章 ゴシップとチャネルグラフ
11.1 ピアの発見
11.1.1 P2Pブートストラップ
11.1.2 DNSブートストラップ
11.1.3 SRVのクエリオプション
11.2 チャネルグラフ
11.2.1 有向グラフ
11.3 ゴシッププロトコルのメッセージ
11.3.1 node_announcementメッセージ
11.3.2 channel_announcementメッセージ
11.3.3 channel_updateメッセージ
11.4 チャネルグラフの継続的な管理
11.5 まとめ
12章 経路探索とペイメントの配送
12.1 ライトニングプロトコルスイートでの経路探索
12.1.1 BOLTはどこ?
12.2 経路探索:解決すべき問題は何か
12.2.1 最適なパスを選択する
12.2.2 数学とコンピュータサイエンスでの経路探索
12.2.3 キャパシティ、残高、流動性
12.2.4 残高の不確実性
12.2.5 経路探索の複雑性
12.2.6 シンプルに保つ
12.3 経路探索とペイメントの配送プロセス
12.4 チャネルグラフの構築
12.4.1 流動性の不確実性と確率
12.4.2 手数料とチャネルのその他の指標
12.5 パスの候補を探す
12.6 ペイメントを送信する:試行錯誤ループ
12.6.1 1 回目の試行:パス1
12.6.2 2 回目の試行:パス4
12.7 マルチパートペイメント
12.7.1 マルチパートペイメントを使う
12.7.2 複数のペイメントラウンドでの試行錯誤
12.8 まとめ
13.1 ライトニングプロトコルスイートのメッセージング層
13.2.1 ワイヤーフレーミング:概要
13.2.2 メッセージタイプのエンコーディング
13.3 TLVメッセージ拡張
13.3.1 Protocol Buffersメッセージフォーマット
13.3.2 前方互換性と後方互換性
13.4.1 BigSizeのエンコーディング
13.4.2 TLVエンコーディングの制約
13.4.3 TLVの正規エンコーディング
13.5 機能ビットとプロトコルの拡張性
13.5.1 機能ビット:アップグレードの検出を可能にするメカニズム
13.5.2 TLVによる前方互換性と後方互換性
13.5.3 アップグレードメカニズムの分類
13.5.4 チャネルの構築レベルのアップグレード
13.6 まとめ
14章 ライトニングの暗号化メッセージトランスポート
14.1 ライトニングプロトコルスイートの暗号化トランスポート
14.2 暗号化トランスポート:概要
14.3 非中央集権PKIとしてのチャネルグラフ
14.4 TLSを使わないのはなぜか
14.5 Noise Protocol Framework
14.6 ライトニングの暗号化トランスポート
14.6.2 ハンドシェイクの表記とプロトコルフロー
14.6.3 ハンドシェイク:概要
14.6.4 3 段階のハンドシェイク
14.7 まとめ
15章 ライトニングのペイメントリクエスト
15.1 ライトニングプロトコルスイートでのインボイス
15.2 ペイメントリクエスト:概要
15.3 ライトニングのペイメントリクエストとビットコインアドレス
15.4 BOLT#11:ライトニングのペイメントリクエストのシリアライズと解釈 15.4.1 ペイメントリクエストの実際のエンコーディング
15.4.2 ヒューマンリーダブルプレフィックス
15.4.3 bech32 とデータセグメント
15.5 まとめ
16章 ライトニングネットワークのセキュリティとプライバシー
16.1 プライバシーはなぜ重要か
16.2 プライバシーの定義
16.3 プライバシーの評価プロセス
16.4 匿名性集合
16.5 ライトニングネットワークとビットコインのプライバシーの違い
16.6 ライトニングでの攻撃
16.6.1 支払い金額を観察する
16.6.2 支払人と受取人を結び付ける
16.6.3 チャネルの残高を明らかにする:プロービング
16.6.4 DoS
16.6.5 コミットメントジャミング
16.6.6 チャネルの流動性のロックアップ
16.7 クロスレイヤーの非匿名化
16.7.1 オンチェーンのビットコインエンティティのクラスタ化
16.7.2 オフチェーンのライトニングノードのクラスタ化
16.7.3 クロスレイヤーでの結び付け:ライトニングノードとビットコインエンティティ
16.8 ライトニンググラフ
16.8.1 実際のライトニンググラフの外観
16.9 ライトニングネットワークの中央集権性
16.10 経済的インセンティブとグラフの構造
16.11 ユーザーのプライバシーを守る:実践的なアドバイス
16.12 非公表チャネル
16.13 ルーティングに関する注意事項
16.13.1 チャネルの受け入れ
16.14 まとめ
16.15 参考文献
17章 おわりに
17.1 非中央集権的な非同期のイノベーション
17.1.1 ビットコインプロトコルとビットコインスクリプトのイノベーション
17.1.2 ライトニングプロトコルのイノベーション
17.1.3 TLVの拡張性
17.1.4 ペイメントチャネルの構造
17.1.5 エンドツーエンドのオプトイン機能
17.2 ライトニングアプリケーション:LApps
17.3 さあ始めよう!
付録A ビットコインのファンダムレビュー
A.1 鍵とデジタル署名
A.1.1 秘密鍵と公開鍵
A.1.2 ハッシュ
A.1.3 デジタル署名
A.1.4 署名ハッシュタイプ
A.2 ビットコイントランザクション
A.2.1 インプットとアウトプット
A.2.2 トランザクションチェーン
A.2.4 アウトポイント:アウトプットID
A.3 ビットコインスクリプト
A.3.1 ビットコインスクリプトを実行する
A.3.2 ロックスクリプトとアンロックスクリプト
A.3.3 公開鍵(署名)にロックする
A.3.4 ハッシュ値(シークレット)にロックする
A.3.5 マルチシグスクリプト
A.3.6 タイムロックスクリプト
A.3.7 複数の条件を持つスクリプト
A.3.8 スクリプトでフロー制御を使う
付録B Dockerの基本的なインストールと使用
B.1 Dockerのインストール
B.2 基本的なDockerコマンド
B.2.1 コンテナを構築する
B.2.2 コンテナを実行する
B.2.3 コンテナでコマンドを実行する
B.2.4 コンテナの終了と開始
B.2.5 コンテナを名前で削除する
B.2.6 実行中のコンテナを一覧表示する
B.2.7 Dockerイメージを一覧表示する
B.3 まとめ
付録C ワイヤープロトコルメッセージ
C.1 メッセージタイプ
C.2 メッセージの構造
C.2.1 接続の確立に関するメッセージ
C.2.2 エラー通知に関するメッセージ
C.2.3 接続のライブネスに関するメッセージ
C.2.4 チャネルファンディングに関するメッセージ
C.2.5 チャネルクロージングに関するメッセージ
C.2.6 チャネルオペレーションに関するメッセージ
C.2.7 チャネルアナウンスに関するメッセージ
C.2.8 チャネルグラフの同期に関するメッセージ
付録D 出典とライセンス告知
D.1 出典
D.2 BTCPay Server
D.3 Lamassu Industries AG